package com.ruoyi.common.exception.base;

import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.StringUtils;

/**
 * 基础异常
 *
 * @author ruoyi
 */
public class BaseException extends RuntimeException {
    private static final long serialVersionUID = 1L;

    /**
     * 所属模块
     */
    private String module;

    /**
     * 错误码
     */
    private String code;

    /**
     * 错误码对应的参数
     */
    private Object[] args;

    /**
     * 错误消息
     */
    private String defaultMessage;

    /**
     * 构造函数，初始化所有字段
     *
     * @param module 所属模块名称
     * @param code 错误码
     * @param args 错误码对应的参数数组
     * @param defaultMessage 默认错误消息
     */
    public BaseException(String module, String code, Object[] args, String defaultMessage) {
        this.module = module;
        this.code = code;
        this.args = args;
        this.defaultMessage = defaultMessage;
    }

    /**
     * 构造函数，使用模块、错误码和参数，无默认消息
     *
     * @param module 所属模块名称
     * @param code 错误码
     * @param args 错误码对应的参数数组
     */
    public BaseException(String module, String code, Object[] args) {
        this(module, code, args, null);
    }

    /**
     * 构造函数，使用模块和默认消息，无错误码
     *
     * @param module 所属模块名称
     * @param defaultMessage 默认错误消息
     */
    public BaseException(String module, String defaultMessage) {
        this(module, null, null, defaultMessage);
    }

    /**
     * 构造函数，使用错误码和参数，无模块信息
     *
     * @param code 错误码
     * @param args 错误码对应的参数数组
     */
    public BaseException(String code, Object[] args) {
        this(null, code, args, null);
    }

    /**
     * 构造函数，仅使用默认消息
     *
     * @param defaultMessage 默认错误消息
     */
    public BaseException(String defaultMessage) {
        this(null, null, null, defaultMessage);
    }

    /**
     * 获取异常消息，优先根据错误码从资源文件中获取，如果获取不到则返回默认消息
     *
     * @return 异常消息字符串
     */
    @Override
    public String getMessage() {
        String message = null;
        // 如果错误码不为空，则尝试从消息工具类中获取对应的消息
        if (!StringUtils.isEmpty(code)) {
            message = MessageUtils.message(code, args);
        }
        // 如果通过错误码无法获取到消息，则使用默认消息
        if (message == null) {
            message = defaultMessage;
        }
        return message;
    }

    /**
     * 获取所属模块
     *
     * @return 模块名称
     */
    public String getModule() {
        return module;
    }

    /**
     * 获取错误码
     *
     * @return 错误码
     */
    public String getCode() {
        return code;
    }

    /**
     * 获取错误码对应的参数数组
     *
     * @return 参数数组
     */
    public Object[] getArgs() {
        return args;
    }

    /**
     * 获取默认错误消息
     *
     * @return 默认错误消息
     */
    public String getDefaultMessage() {
        return defaultMessage;
    }
}

